<html>
<script>

var alert = console.log;
var reg = /\s.+/;
var str='This is a test String.';
alert(reg.exec(str)); // 返回“is a test String，正则的意思是匹配第一个空格以及其后的所有非换行字符。

/*
同样，\S表示非空格字符。
匹配结果为This，当遇到第一个空格之后，正则就停止匹配了。
*/

var reg1 = /\S+/;
var str1='This is a test String.';
alert(reg1.exec(str1));

var reg = /\w+/;
var str='.className';
alert(reg.exec(str));
// 结果显示匹配了字符串中的className，只有第一个“.”唯一的非单词字符没有匹配。

// \W表示非单词字符，等效于[^a-zA-Z0-9_]

var reg = /\W+/;
var str='正则教程';
alert(reg.exec(str));
// 返回完整的字符串，因为，中文算作是非单词字符。

var reg = /(\w)(\w)/;
var str='zhufengpeixun';
alert(reg.exec(str));
//返回zh,z,h // ,zh是整个正则匹配的内容，z是第一个括号里的子正则表达式匹配的内容，h是第二个括号匹配的内容。

var reg = /(\w)\1/;
var str='zhufengpeixun';
alert(reg.exec(str));
/*则会返回null。这里的“\1”就叫做反向引用，它表示的是第一个括号内的子正则表达式匹配的内容。在上面的例子中，第一个括号里的(\w)匹配了z，因此“\1”就同样表示z了，在余下的字符串里自然找不到z了。与第二个例子对比就可以发现，“\1”是等同于“第1个括号匹配的内容”，而不是“第一个括号的内容”。
*/

var reg = /(\w)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));
// 这个正则则会匹配到bb,b。同样，前面有几个子正则表达式我们就可以使用几个反向引用。

var reg = /(\w)(\w)\2\1/;
var str='woow';
alert(reg.exec(str));
/*会匹配成功，因为第一个括号匹配到w，第二个括号匹配到o，而\2\1则表示ow，恰好匹配了字符串的最后两个字符。*/

/*
这个正则是为了实现只匹配以b或者c开头的字符串，一直匹配到换行字符，但是。上面我们已经看到了，可以使用“\1”来反向引用这个括号里的子正则表达式所匹配的内容。而且exec方法也会将这个字正则表达式的匹配结果保存到返回的结果中。
*/
var reg = /^(b|c).+/;
var str='bbs.blueidea.com';
alert(reg.exec(str));

/*
使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。
可以看到返回的结果不再包括那个括号内的字正则表达式多匹配的内容。同理，反向引用也不好使了：
*/
var reg = /^(?:b|c).+/;
var str='bbs.blueidea.com';
alert(reg.exec(str));

/*
返回bb,b。bb是整个正则表达式匹配的内容，而b是第一个子正则表达式匹配的内容。
*/
var reg = /^(b|c)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));

var reg = /^(?:b|c)\1/;
var str='bbs.zhufengpeixun.cn';
alert(reg.exec(str));
// 返回null。由于根本就没有记录括号内匹配的内容，自然没有办法反向引用了。
</script>
</html>